package com.cheng.example.book.advise151.chap5;

import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 集合中的元素必须做到compareTo和equals同步
 * <p>
 * indexOf依赖equals方法查找，binarySearch则依赖compareTo方法查找；
 * equals是判断元素是否相等，compareTo是判断元素在排序中的位置是否相同。
 * 　　既然一个决定排序位置，一个是决定相等，那我们就应该保证当排序相同时，其equals也相同，否则就会产生逻辑混乱。
 * <p>
 * 　　注意：实现了compareTo方法就应该覆写equals方法，确保两者同步。
 */
class City implements Comparable<City> {
    private String code;
    private String name;

    public City(String _code, String _name) {
        code = _code;
        name = _name;
    }

    //code、name的setter和getter方法略
    @Override
    public int compareTo(City o) {
        //按照城市名称排序
        return new CompareToBuilder().append(name, o.name).toComparison();
    }

    @Override
    public boolean equals(Object obj) {
        if (null == obj) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (obj.getClass() != getClass()) {
            return false;
        }
        City city = (City) obj;
        // 根据code判断是否相等
        return new EqualsBuilder().append(code, city.code).isEquals();
    }
}

/**
 * 从这点可以看到得到下标的方式是走的equal
 */
public class Client75 {
    public static void main(String[] args) {
        List<City> cities = new ArrayList<City>();
        cities.add(new City("021", "上海"));
        cities.add(new City("021", "沪"));
        // 排序
        Collections.sort(cities);
        // 查找对象
        City city = new City("021", "沪");
        // indexOf方法取得索引值
        int index1 = cities.indexOf(city);
        // binarySearch查找索引值,这种走的是compareTo
        int index2 = Collections.binarySearch(cities, city);
        System.out.println(" 索引值(indexOf) :" + index1);
        System.out.println(" 索引值(binarySearch) :" + index2);
    }
}
